package main

import (
	"encoding/base64"
	"encoding/hex"
	"fmt"
	"iss/security/aes"
	"iss/security/dsa"
	"iss/security/hmac"
	"iss/security/md5"
	"iss/security/rc4"
	"iss/security/rsa"
)

func main() {
	// 测试MD5
	//testMD5()
	//fmt.Println("***************************************************************************")

	// 测试RSA
	testRSA()
	fmt.Println("***************************************************************************")

	// 测试RC4
	//testRC4()
	//fmt.Println("***************************************************************************")

	// 测试DSA
	//testDSA()
	//fmt.Println("***************************************************************************")

	// 测试ECDSA
	//testECDSA()
	//fmt.Println("***************************************************************************")

	// 测试HMAC
	//testHMAC()
	//fmt.Println("***************************************************************************")

	// 测试AES
	//testAES()
	//fmt.Println("***************************************************************************")
}

// md5测试
func testMD5() {
	source := "hello"
	fmt.Println("origin: {}", source)
	fmt.Println(md5.GetMD5Encode(source))
	fmt.Println(md5.Get16MD5Encode(source))
	/*fmt.Println(md5.GetMD5WithSalt(source,
	"hsdhaksodaksdkjaskdkjaskjdkjasdkjaksjdkjaskjdjkkj",
	"hsjdgaghsdghahgsdghgabsbbcbbsk29318293"))*/
}

// rsa测试
func testRSA() {
	//rsa 密钥文件产生
	fmt.Println("-------------------------------获取RSA公私钥-----------------------------------------")
	prvKey, pubKey := rsa.GenRsaKey()
	fmt.Println(string(prvKey))
	fmt.Println(string(pubKey))

	fmt.Println("-------------------------------进行签名与验证操作-----------------------------------------")
	var data = "卧了个槽，这么神奇的吗？？！！！  ԅ(¯﹃¯ԅ) ！！！！！！）"
	fmt.Println("对消息进行签名操作...")
	signData := rsa.SignWithSha256([]byte(data), prvKey)
	fmt.Println("消息的签名信息： ", hex.EncodeToString(signData))
	fmt.Println("\n对签名信息进行验证...")
	if rsa.VerySignWithSha256([]byte(data), signData, pubKey) {
		fmt.Println("签名信息验证成功，确定是正确私钥签名！！")
	}

	fmt.Println("-------------------------------进行加密解密操作-----------------------------------------")
	ciphertext := rsa.Encrypt([]byte(data), pubKey)
	fmt.Println("公钥加密后的数据：", hex.EncodeToString(ciphertext))
	sourceData := rsa.Decrypt(ciphertext, prvKey)
	fmt.Println("私钥解密后的数据：", string(sourceData))
}

// rc4测试
func testRC4() {
	key := []byte("hsdhashdab23078188asfh182nfdghavnb-w817294")
	source := "rc4测试"

	encrypt := rc4.Encrypt([]byte(source), key)
	fmt.Println("encrypt: ", encrypt)
	fmt.Println("加密后: {}", string(encrypt))
	decrypt := rc4.Decrypt(encrypt, key)
	fmt.Println("解密后: {}", string(decrypt))

	fmt.Println("/////////////////////////////")

	//sou := []byte{101, 146, 190, 132, 137, 206, 227, 57, 158}
	//sou := []byte{69, 178, 190, 132, 137, 206, 227, 57, 158}
	//a := string(sou)
	//fmt.Println(a)
	//res := rc4.Decrypt([]byte(a), key)
	//fmt.Println(res)
	//fmt.Println(string(res))

	sou := []byte{69, 178, 190, 132, 137, 206, 227, 57, 158}
	ct := "E������9�"
	k := "hsdhashdab23078188asfh182nfdghavnb-w817294"

	fmt.Println(ct)
	fmt.Println(string(sou))

	fmt.Println(ct == string(sou))
	fmt.Println(k == string(key))
}

// dsa测试
func testDSA() {
	prvKey, pubKey := dsa.GenerateKey()
	source := "哈哈哈哈"
	badSource := "h哈哈哈哈"

	r, s := dsa.Sign(source, prvKey)
	fmt.Println("签名 r: , s: ", r, s)
	success := dsa.Verify(source, pubKey, r, s)
	fmt.Println("数据未被篡改, 成功验签: ", success)
	fail := dsa.Verify(badSource, pubKey, r, s)
	fmt.Println("数据已被篡改, 失败验签: ", fail)
}

// 测试ECDSA
func testECDSA() {

}

// 测试HMAC
func testHMAC() {
	fmt.Println(hmac.HMAC("hello", "adan"))
}

// 测试AES
func testAES() {
	// 加密
	src := []byte("123456")
	key := []byte("1234512345123451")

	dst, _ := aes.ECBEncrypt(src, key)
	fmt.Println(dst)
	fmt.Println(base64.StdEncoding.EncodeToString(dst))

	res, _ := aes.ECBDecrypt(dst, key)
	fmt.Println(res)
	fmt.Println(string(res))
}
